#ifndef TRANSFILE_H
#define TRANSFILE_H

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <ctype.h>
#include <stdbool.h>

/* // 检查命令行参数数量是否符合预期 */
/* #define ARGS_CHECK(argc, expected) \ */
/*     do { \ */
/*         if ((argc) != (expected)) { \ */
/*             fprintf(stderr, "args num error!\n"); \ */ 
/*             exit(1); \ */       
/*         } \ */                          
/*     } while (0) */                      

/* // 检查返回值是否是错误标记,若是则打印msg和错误信息 */
/* #define ERROR_CHECK(ret, error_flag, msg) \ */
/*     do { \ */
/*         if ((ret) == (error_flag)) { \ */
/*             perror(msg); \ */
/*             exit(1); \ */
/*         } \ */
/*     } while (0) */

#include <sys/stat.h>       // 使用该函数需要包含的头文件
#include <unistd.h>    
#include <sys/stat.h>
#include <sys/types.h>
#include <dirent.h>
#include <pwd.h>
#include <grp.h>
#include <time.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/select.h>
#include <sys/wait.h>
#include <sys/shm.h>
#include <signal.h>
#include <pthread.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/epoll.h>
#include <sys/sendfile.h>
#include <mysql/mysql.h>
#include <arpa/inet.h>

// 命令定义
#define CMD_UPLOAD          1 // 上传
#define CMD_DOWNLOAD        2 // 下载
#define CMD_DELETE          3 // 删除
#define CMD_UPLOAD_RESUME   4 // 接着上传
#define CMD_DOWNLOAD_RESUME 5 // 接着下载
#define CMD_GET_OFFSET      6 // 获取文件偏移量

// TLV类型定义
#define TYPE_COMMAND        6  // 命令
#define TYPE_FILENAME       7  // 文件名
#define TYPE_FILESIZE       8  // 文件大小
#define TYPE_FILEDATA       9  // 文件内容
#define TYPE_OFFSET         10 // 偏移量
#define TYPE_STATUS         11 // 状态码

typedef struct {
    int type;       // 数据类型
    int length;     // 数据长度
    char data[0];   // 可变长数据
} tlv_t;

// 完整发送
int sendn(int fd, const void *buf, size_t n);
// 完整接收
int recvn(int fd, void *buf, size_t n);
// 发送TLV数据包
int send_tlv(int fd, int type, const void *data, size_t length);
// 接收TLV数据包
int recv_tlv(int fd, int *type, void *buf, size_t *length);
// 发送文件
int send_file(int netfd, const char *filename, int resume);
// 接收文件
int recv_file(int netfd, const char *filename, int resume);
// 处理客户端发来的命令
int handle_command(int netfd);


#endif
